ট্রান্সাকশন ম্যানেজমেন্ট কী?
ট্রান্সাকশন ম্যানেজমেন্ট (Transaction Management) হলো একাধিক ডেটাবেস অপারেশনকে একটি ইউনিট হিসেবে পরিচালনা করা। যদি এই ইউনিটের মধ্যে কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে পুরো ইউনিটটিকে ব্যর্থ ঘোষণা করা হয় এবং পূর্ববর্তী সকল পরিবর্তন পূর্বাবস্থায় ফেরত (rollback) নেওয়া হয়।
স্প্রিং ফ্রেমওয়ার্কে ট্রান্সাকশন ম্যানেজমেন্টের সুবিধা রয়েছে যা ডেটাবেসের সাথে কাজ করা আরও সহজ এবং নিরাপদ করে তোলে।
স্প্রিং ওআরএম এ ট্রান্সাকশন ম্যানেজমেন্ট কনফিগারেশন
Spring ORM এ Hibernate এর সাথে ট্রান্সাকশন ম্যানেজমেন্ট সেটআপ করতে নিম্নলিখিত স্টেপগুলো অনুসরণ করতে হবে।
spring-tx নির্ভরশীলতা যোগ করা
ট্রান্সাকশন ব্যবস্থাপনার জন্য Maven প্রজেক্টে spring-tx নির্ভরশীলতা যুক্ত করতে হবে।
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.12</version>
</dependency>
ট্রান্সাকশন ম্যানেজার কনফিগারেশন
Spring এ Hibernate ট্রান্সাকশন ম্যানেজার কনফিগার করতে হবে। এটি Spring Bean Configuration ফাইলে যুক্ত করা যেতে পারে।
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven> ব্যবহার
Spring XML ফাইলে ট্রান্সাকশন এনোটেশন সক্রিয় করতে <tx:annotation-driven> ট্যাগ ব্যবহার করতে হবে।
<tx:annotation-driven transaction-manager="transactionManager" />
@Transactional এনোটেশন
@Transactional এনোটেশন ব্যবহার করে নির্দিষ্ট মেথড বা ক্লাসে ট্রান্সাকশন ম্যানেজমেন্ট প্রয়োগ করা যায়।
package com.example.service;
import com.example.dao.UserDao;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void saveUser(User user) {
userDao.saveUser(user);
}
}
উদাহরণ
নিম্নে Spring ORM এবং Hibernate এর সাথে ট্রান্সাকশন ম্যানেজমেন্টের একটি উদাহরণ দেওয়া হলো।
DAO (Data Access Object)
package com.example.dao;
import com.example.model.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class UserDao {
@Autowired
private SessionFactory sessionFactory;
public void saveUser(User user) {
Session session = sessionFactory.getCurrentSession();
session.save(user);
}
public void updateUser(User user) {
Session session = sessionFactory.getCurrentSession();
session.update(user);
}
}
Service Layer
package com.example.service;
import com.example.dao.UserDao;
import com.example.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void saveOrUpdateUser(User user) {
userDao.saveUser(user);
// Example of another database operation in the same transaction
user.setName("Updated Name");
userDao.updateUser(user);
}
}
Main Class
package com.example;
import com.example.config.AppConfig;
import com.example.model.User;
import com.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
userService.saveOrUpdateUser(user);
System.out.println("Transaction completed successfully!");
}
}
গুরুত্বপূর্ণ বিষয়
@Transactionalএনোটেশনটি সেই মেথডে ব্যবহার করা হয় যেখানে একাধিক ডেটাবেস অপারেশন একই ট্রান্সাকশনের আওতায় পরিচালিত হবে।- যদি কোনো অপারেশন ব্যর্থ হয়, তাহলে Spring পুরো ট্রান্সাকশন রোলব্যাক করে পূর্বাবস্থায় ফেরত নিয়ে যায়।
- ট্রান্সাকশন ম্যানেজমেন্ট সেটআপে সঠিকভাবে
transactionManagerকনফিগার করা আবশ্যক।
Spring ORM এর মাধ্যমে Hibernate এর সাথে ট্রান্সাকশন ম্যানেজমেন্ট খুব সহজ এবং কার্যকরভাবে পরিচালনা করা যায়।
ট্রানজ্যাকশন ম্যানেজমেন্ট (Transaction Management) কী?
ট্রানজ্যাকশন ম্যানেজমেন্ট হলো ডেটাবেস অপারেশনের একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, যা নিশ্চিত করে যে একটি গ্রুপ ডেটাবেস অপারেশন (যেমন Insert, Update, Delete) একটি একক ইউনিট হিসেবে কার্যকর হচ্ছে। যদি কোনো একটি অপারেশন ব্যর্থ হয়, তাহলে পুরো ট্রানজ্যাকশন বাতিল (Rollback) হয়ে যায় এবং ডেটাবেস আগের অবস্থায় ফিরে যায়।
Spring Framework-এর Transaction Management ডেভেলপারদের জন্য ডেটাবেস অপারেশন পরিচালনা করার একটি সরল এবং কার্যকর উপায় প্রদান করে।
ট্রানজ্যাকশন ম্যানেজমেন্টের মূল নীতি
ট্রানজ্যাকশন ম্যানেজমেন্ট চারটি মূল নীতি (ACID Properties) মেনে চলে:
- Atomicity: একটি ট্রানজ্যাকশন সম্পূর্ণভাবে কার্যকর হবে অথবা একেবারে কার্যকর হবে না।
- Consistency: ট্রানজ্যাকশনের পরে ডেটাবেস একটি সঠিক এবং সঙ্গতিপূর্ণ অবস্থায় থাকবে।
- Isolation: প্রতিটি ট্রানজ্যাকশন আলাদাভাবে কার্যকর হবে এবং অন্য কোনো ট্রানজ্যাকশনের দ্বারা প্রভাবিত হবে না।
- Durability: ট্রানজ্যাকশন সফলভাবে সম্পন্ন হলে, ডেটা স্থায়ীভাবে সংরক্ষিত হবে।
স্প্রিং ওআরএম এ ট্রানজ্যাকশন ম্যানেজমেন্ট
Spring Framework বিভিন্ন ORM (Hibernate, JPA) এবং ডেটাবেসের সঙ্গে সহজে ইন্টিগ্রেশন করার জন্য Transaction Management সরবরাহ করে। এটি Declarative (Annotation বা XML ব্যবহার) এবং Programmatic (কোডের মাধ্যমে) পদ্ধতিতে পরিচালিত হতে পারে।
স্প্রিং ট্রানজ্যাকশন ম্যানেজমেন্ট কনফিগারেশন
১. XML ভিত্তিক কনফিগারেশন
Spring এর XML ফাইল ব্যবহার করে ট্রানজ্যাকশন কনফিগার করা যায়। উদাহরণস্বরূপ:
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
২. জাভা ভিত্তিক কনফিগারেশন
Java Configuration ব্যবহার করে ট্রানজ্যাকশন ম্যানেজমেন্ট কনফিগার করা হয়। উদাহরণ:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
}
ডিক্লারেটিভ ট্রানজ্যাকশন ম্যানেজমেন্ট
Spring এ ডিক্লারেটিভ পদ্ধতিতে ট্রানজ্যাকশন ম্যানেজ করার জন্য @Transactional এনোটেশন ব্যবহার করা হয়। এটি ডেটাবেস অপারেশনগুলিকে স্বয়ংক্রিয়ভাবে Rollback বা Commit করতে সাহায্য করে।
উদাহরণ:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(User user) {
userRepository.save(user);
}
}
প্রোগ্রামেটিক ট্রানজ্যাকশন ম্যানেজমেন্ট
যখন ডেভেলপাররা কোডের মাধ্যমে ট্রানজ্যাকশন পরিচালনা করতে চান, তখন TransactionTemplate বা PlatformTransactionManager ব্যবহার করা হয়।
উদাহরণ:
@Service
public class UserService {
@Autowired
private PlatformTransactionManager transactionManager;
public void createUser(User user) {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// Perform database operations
userRepository.save(user);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
}
স্প্রিং ট্রানজ্যাকশন ম্যানেজমেন্টের সুবিধা
- ডেটা অখণ্ডতা রক্ষা: ACID নীতিমালা মেনে ডেটার অখণ্ডতা নিশ্চিত করে।
- সহজ ইন্টিগ্রেশন: Hibernate, JPA, এবং JDBC-এর মতো বিভিন্ন ORM এবং ডেটাবেস টুলের সঙ্গে ইন্টিগ্রেশন সহজ।
- ডিক্লারেটিভ পদ্ধতি: @Transactional ব্যবহার করে কোড কমিয়ে আনা যায়।
- ট্রানজ্যাকশন সমর্থন: Nested এবং Chained Transaction পরিচালনা করার ক্ষমতা।
স্প্রিং ORM এ ট্রানজ্যাকশন ম্যানেজমেন্টের গুরুত্ব
Spring ORM এ Transaction Management নিশ্চিত করে যে ডেটাবেস অ্যাক্সেস সঠিকভাবে পরিচালিত হচ্ছে এবং এর ফলে ডেটাবেস ব্যতিক্রমী অবস্থায়ও সঠিক অবস্থায় থাকে। এটি একটি ডেটা-ভিত্তিক অ্যাপ্লিকেশনের নির্ভরযোগ্যতা এবং কার্যকারিতা নিশ্চিত করতে অপরিহার্য।
Spring Framework ডেটাবেসের সঙ্গে কাজ করার সময় ট্রানজ্যাকশন পরিচালনার জন্য দুটি পদ্ধতি সরবরাহ করে: Declarative Transaction Management এবং Programmatic Transaction Management। এই পদ্ধতিগুলো Spring ORM, JDBC বা JPA-এর মতো ডেটা অ্যাক্সেস টেকনোলজির সঙ্গে ব্যবহার করা যায়।
Declarative Transaction Management
Declarative Transaction Management ট্রানজ্যাকশন পরিচালনার জন্য XML বা অ্যানোটেশন কনফিগারেশনের উপর নির্ভর করে। এখানে কোডের মাধ্যমে ট্রানজ্যাকশন ম্যানেজ করার প্রয়োজন হয় না। এটি সাধারণত সহজ ও পরিষ্কার পদ্ধতি এবং Spring Framework-এ সর্বাধিক ব্যবহৃত পদ্ধতি।
কিভাবে কাজ করে:
- Spring এর @Transactional অ্যানোটেশন ব্যবহার করে নির্দিষ্ট মেথড বা ক্লাসে ট্রানজ্যাকশন পরিচালনা করা যায়।
- XML কনফিগারেশনের মাধ্যমে ট্রানজ্যাকশন ডিফাইন করা সম্ভব।
- Spring AOP (Aspect-Oriented Programming) ব্যবহার করে ট্রানজ্যাকশন পরিচালনা করে।
সুবিধা:
- সহজতা: কোনো অতিরিক্ত কোড লেখা প্রয়োজন হয় না।
- কোড পরিষ্কার: ট্রানজ্যাকশন সংক্রান্ত কোড আলাদা থাকে।
- AOP Integration: AOP এর মাধ্যমে ট্রানজ্যাকশন পরিচালনা আরও কার্যকর হয়।
উদাহরণ (Annotation-based):
@Transactional
public void performTransaction() {
// ডেটাবেস অপারেশন
}
উদাহরণ (XML-based):
<tx:advice transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
Programmatic Transaction Management
Programmatic Transaction Management হলো একটি পদ্ধতি যেখানে ট্রানজ্যাকশন ম্যানেজমেন্টের জন্য কোড সরাসরি লেখা হয়। এটি জটিল প্রয়োজনে ব্যবহার করা হয় যেখানে ট্রানজ্যাকশন লজিক ডায়নামিক।
কিভাবে কাজ করে:
- TransactionTemplate বা PlatformTransactionManager API ব্যবহার করে ট্রানজ্যাকশন পরিচালনা করা হয়।
- ডেভেলপাররা ম্যানুয়ালি ট্রানজ্যাকশন শুরু, কমিট বা রোলব্যাক করতে পারেন।
সুবিধা:
- নিয়ন্ত্রণ: ডেভেলপাররা সম্পূর্ণ ট্রানজ্যাকশন প্রক্রিয়ার উপর নিয়ন্ত্রণ পান।
- জটিল লজিক: জটিল এবং ডায়নামিক ট্রানজ্যাকশন লজিক প্রয়োগের ক্ষেত্রে কার্যকর।
উদাহরণ:
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(status -> {
try {
// ডেটাবেস অপারেশন
return null;
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
});
Declarative এবং Programmatic Transaction Management এর তুলনা
| বৈশিষ্ট্য | Declarative Transaction Management | Programmatic Transaction Management |
|---|---|---|
| সহজতা | কোড সহজ এবং পরিষ্কার থাকে | কোড জটিল হতে পারে |
| কোডের স্থান | ট্রানজ্যাকশন লজিক কোডের বাইরে থাকে | ট্রানজ্যাকশন লজিক কোডের ভেতরে থাকে |
| নিয়ন্ত্রণ | সীমিত নিয়ন্ত্রণ প্রদান করে | সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে |
| ব্যবহারক্ষেত্র | সাধারণ ট্রানজ্যাকশনের জন্য | জটিল বা ডায়নামিক ট্রানজ্যাকশনের জন্য |
Spring Framework-এ সাধারণত Declarative Transaction Management পদ্ধতি বেশি ব্যবহৃত হয়, কারণ এটি সহজ এবং পরিচ্ছন্ন। তবে জটিলতার ক্ষেত্রে Programmatic Transaction Management কার্যকর হতে পারে।
@Transactional অ্যানোটেশনটি স্প্রিং ফ্রেমওয়ার্কে ট্রানজেকশন ম্যানেজমেন্ট (Transaction Management) পরিচালনার জন্য ব্যবহৃত হয়। এটি ডেটাবেস অপারেশনগুলিকে একটি ইউনিট অফ ওয়ার্ক (Unit of Work) হিসেবে পরিচালনা করে, যেখানে সমস্ত কাজ সফলভাবে সম্পন্ন হলে ডেটাবেসে পরিবর্তনগুলো কার্যকর করা হয়। কোনো ত্রুটি ঘটলে সম্পূর্ণ ট্রানজেকশন বাতিল (Rollback) হয়ে যায়।
@Transactional Annotation কী?
@Transactional অ্যানোটেশন ব্যবহার করে স্প্রিং কনটেইনারকে নির্দেশ করা হয় যে, নির্দিষ্ট মেথড বা ক্লাসের মধ্যে থাকা সমস্ত ডেটাবেস অপারেশন একটি ট্রানজেকশনের অংশ। এটি সাধারণত ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশনের সময় ব্যবহার করা হয়।
@Transactional Annotation এর মূল বৈশিষ্ট্য
- অটোমেটিক রোলব্যাক (Automatic Rollback): কোনো ব্যতিক্রম ঘটলে ট্রানজেকশন রোলব্যাক হয়।
- কনফিগারেশন সিম্পলিসিটি: XML বা প্রোগ্রাম্যাটিক কনফিগারেশনের প্রয়োজন ছাড়াই ডিক্লারেটিভ ট্রানজেকশন ম্যানেজমেন্ট সহজ করে।
- পয়েন্টেড কন্ট্রোল: নির্দিষ্ট মেথড বা ক্লাসে ট্রানজেকশন প্রয়োগ করা যায়।
- নেস্টেড ট্রানজেকশন সাপোর্ট: একাধিক স্তরের ট্রানজেকশন হ্যান্ডলিংয়ের সুবিধা।
@Transactional Annotation এর ব্যবহার
মেথড লেভেলে ব্যবহার
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Transactional
public void saveEmployee(Employee employee) {
// Save employee to the database
employeeRepository.save(employee);
}
}
ক্লাস লেভেলে ব্যবহার
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class EmployeeService {
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
public void deleteEmployeeById(int id) {
employeeRepository.deleteById(id);
}
}
ব্যাখ্যা:
- মেথড লেভেলে @Transactional ব্যবহার করলে শুধুমাত্র ওই নির্দিষ্ট মেথডের উপর ট্রানজেকশন কার্যকর হয়।
- ক্লাস লেভেলে ব্যবহার করলে ক্লাসের সমস্ত মেথড ট্রানজেকশনের অধীনে চলে আসে।
@Transactional এর প্যারামিটার
propagation
ট্রানজেকশনের প্রসার নির্ধারণ করে। উদাহরণ:
- REQUIRED: বিদ্যমান ট্রানজেকশনে যোগ দেয়, না থাকলে নতুন ট্রানজেকশন শুরু করে।
- REQUIRES_NEW: নতুন ট্রানজেকশন তৈরি করে।
- NESTED: একটি নেস্টেড ট্রানজেকশন তৈরি করে।
isolation
ডেটাবেস আইসোলেশন লেভেল নির্ধারণ করে। উদাহরণ:
- READ_COMMITTED: কেবলমাত্র কমিট হওয়া ডেটা পড়তে দেয়।
- READ_UNCOMMITTED: কমিট হওয়া বা না হওয়া উভয় ডেটা পড়তে দেয়।
- REPEATABLE_READ: একই ডেটা বারবার পড়লে একই ফলাফল দেয়।
- SERIALIZABLE: ট্রানজেকশন সিকোয়েন্সে কার্যকর হয়।
timeout
ট্রানজেকশন সম্পন্ন হওয়ার জন্য সময়সীমা নির্ধারণ করে।
rollbackFor
কোনো নির্দিষ্ট এক্সসেপশনের জন্য রোলব্যাক করার নিয়ম নির্ধারণ করে।
উদাহরণ
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, timeout = 5)
public void updateEmployee(Employee employee) {
employeeRepository.save(employee);
}
@Transactional Annotation ব্যবহার করার সুবিধা
- সহজ ট্রানজেকশন ম্যানেজমেন্ট: কোডের মধ্যে ম্যানুয়াল ট্রানজেকশন হ্যান্ডলিংয়ের প্রয়োজন নেই।
- রোলব্যাক সুবিধা: কোনো ব্যতিক্রম ঘটলে স্বয়ংক্রিয়ভাবে রোলব্যাক হয়।
- পরিষ্কার এবং পড়তে সহজ কোড: ডিক্লারেটিভ পদ্ধতিতে ট্রানজেকশন হ্যান্ডলিং করা যায়।
- ডেটা ইন্টিগ্রিটি: একাধিক ডেটাবেস অপারেশন একসাথে সফল হলে তবেই ডেটা চূড়ান্তভাবে পরিবর্তিত হয়।
উদাহরণ: @Transactional এর পূর্ণাঙ্গ ব্যবহার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
@Transactional
public void transferSalary(int fromEmployeeId, int toEmployeeId, double amount) {
Employee fromEmployee = employeeRepository.findById(fromEmployeeId).orElseThrow();
Employee toEmployee = employeeRepository.findById(toEmployeeId).orElseThrow();
fromEmployee.setSalary(fromEmployee.getSalary() - amount);
toEmployee.setSalary(toEmployee.getSalary() + amount);
employeeRepository.save(fromEmployee);
employeeRepository.save(toEmployee);
}
}
ব্যাখ্যা:
উপরের উদাহরণে, দুটি ডেটাবেস অপারেশন (দুটি এমপ্লয়ির বেতন হালনাগাদ করা) একটি ট্রানজেকশনের অংশ। কোনো একটি অপারেশনে ব্যর্থতা ঘটলে সম্পূর্ণ ট্রানজেকশন রোলব্যাক হবে।
স্প্রিং ফ্রেমওয়ার্কে ট্রানজ্যাকশন ম্যানেজমেন্ট একটি গুরুত্বপূর্ণ বৈশিষ্ট্য। এটি ডেটাবেসে Atomicity, Consistency, Isolation, এবং Durability (ACID) প্রিন্সিপাল মেনে ডেটা পরিচালনা নিশ্চিত করে। স্প্রিং ORM ট্রানজ্যাকশন পরিচালনার জন্য Declarative এবং Programmatic পদ্ধতি প্রদান করে। সাধারণত Declarative পদ্ধতি সবচেয়ে বেশি ব্যবহৃত হয় কারণ এটি সরল ও কার্যকর।
ট্রানজ্যাকশন ম্যানেজমেন্টের ধরন
Declarative Transaction Management
এটি অ্যানোটেশন বা XML কনফিগারেশনের মাধ্যমে ট্রানজ্যাকশন পরিচালনা করে। কোডে কম জটিলতা থাকে এবং সহজেই ট্রানজ্যাকশন পরিচালনা করা যায়।
Programmatic Transaction Management
এটি ম্যানুয়ালি ট্রানজ্যাকশন শুরু এবং শেষ করার জন্য TransactionTemplate বা PlatformTransactionManager ব্যবহার করে।
উদাহরণ: Spring ORM-এ Declarative Transaction Management
প্রয়োজনীয় ডিপেনডেন্সি যোগ করা
pom.xml ফাইলে ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId> <!-- H2 ডাটাবেস ব্যবহার -->
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Entity ক্লাস তৈরি করা
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String accountHolder;
private Double balance;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getAccountHolder() {
return accountHolder;
}
public void setAccountHolder(String accountHolder) {
this.accountHolder = accountHolder;
}
public Double getBalance() {
return balance;
}
public void setBalance(Double balance) {
this.balance = balance;
}
}
JpaRepository ইন্টারফেস তৈরি করা
import org.springframework.data.jpa.repository.JpaRepository;
public interface AccountRepository extends JpaRepository<Account, Long> {
}
ট্রানজ্যাকশন ম্যানেজমেন্ট ব্যবহার করে সার্ভিস তৈরি করা
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AccountService {
@Autowired
private AccountRepository accountRepository;
@Transactional
public void transfer(Long fromAccountId, Long toAccountId, Double amount) {
Account fromAccount = accountRepository.findById(fromAccountId).orElseThrow();
Account toAccount = accountRepository.findById(toAccountId).orElseThrow();
if (fromAccount.getBalance() < amount) {
throw new IllegalArgumentException("Insufficient balance");
}
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
}
কন্ট্রোলার তৈরি করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/accounts")
public class AccountController {
@Autowired
private AccountService accountService;
@PostMapping("/transfer")
public String transfer(@RequestParam Long fromAccountId,
@RequestParam Long toAccountId,
@RequestParam Double amount) {
accountService.transfer(fromAccountId, toAccountId, amount);
return "Transfer successful!";
}
}
অ্যাপ্লিকেশন প্রোপার্টিজ কনফিগার করা
application.properties ফাইলে ডাটাবেস কনফিগারেশন যোগ করুন:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
প্রোগ্রামের কার্যপ্রবাহ
- HTTP POST রিকোয়েস্ট ব্যবহার করে
/accounts/transferএ ডাটা পাঠান। - সার্ভিস স্তরে
@Transactionalঅ্যানোটেশন ব্যবহার করা হয়েছে, যা নিশ্চিত করে যে ট্রানজ্যাকশন সফল হলে ডাটাবেসে পরিবর্তন সংরক্ষিত হবে। ব্যর্থ হলে সমস্ত অপারেশন রোলব্যাক (Rollback) হবে।
সারাংশ
স্প্রিং ORM-এ ট্রানজ্যাকশন ম্যানেজমেন্ট সহজ এবং কার্যকর। @Transactional অ্যানোটেশন ব্যবহার করে Declarative পদ্ধতিতে ডেটাবেস অপারেশন পরিচালনা করা যায়। এটি ডেটা কনসিস্টেন্সি নিশ্চিত করে এবং ডেভেলপারদের জটিল কোড লিখতে হয় না।
Read more